﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.OleDb;
using System.Data;
using GAIA_Logica;
using System.IO;

namespace GAIA_IU
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        private string realPhysicalPath;
        Estudio estudio = new Estudio();
        List<Elemento> listaElementos = new List<Elemento>();

        protected void Page_Load(object sender, EventArgs e)
        {
            getEstudioDetalle();
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (FileUpload1.HasFile)
                try
                {
                    eliminarInventario();

                    string fileExt = System.IO.Path.GetExtension(FileUpload1.FileName);

                    string root = Server.MapPath("~");
                    string parent = System.IO.Path.GetDirectoryName(root);
                    string gparent = System.IO.Path.GetDirectoryName(parent);
                    realPhysicalPath = System.IO.Path.GetDirectoryName(root);
                    realPhysicalPath = realPhysicalPath + "\\gaia\\Resources\\newExcelFile" + fileExt;

                    FileUpload1.SaveAs(realPhysicalPath);

                    Label1.Text = "Nombre de documento: " +
                         FileUpload1.PostedFile.FileName + "<br>" +
                         FileUpload1.PostedFile.ContentLength + " kb<br>" +
                         "Tipo de contenido: " +
                         FileUpload1.PostedFile.ContentType + " kb<br>" +
                         "Path servidor: " + realPhysicalPath;

                    readNewFileCSV();
                }
                catch (Exception ex)
                {
                    Label1.Text = "ERROR: " + ex.Message.ToString() + "\n Path: " + realPhysicalPath;
                }
            else
            {
                Label1.Text = "Especifique un documento.";
            }

        }

        private void readNewFile()
        {
            /*string connString = ConfigurationManager.ConnectionStrings["xls"].ConnectionString;
            // Create the connection object
            OleDbConnection oledbConn = new OleDbConnection(connString);*/

            string ExcelConnection = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + realPhysicalPath + "';Extended Properties=Excel 12.0 Macro;Persist Security Info=False;Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" + realPhysicalPath;
            OleDbConnection oledbConn = new OleDbConnection(ExcelConnection); 
            //OleDbConnection oledbConn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + realPhysicalPath + "';Extended Properties=Excel 12.0 Macro;Persist Security Info=False");
            
            try
            {
                // Open connection
                oledbConn.Open();

                // Create OleDbCommand object and select data from worksheet Sheet1
                OleDbCommand cmd = new OleDbCommand("SELECT * FROM [CensoTerrenoUp$]", oledbConn);

                // Create new OleDbDataAdapter
                OleDbDataAdapter oleda = new OleDbDataAdapter();

                oleda.SelectCommand = cmd;

                // Create a DataSet which will hold the data extracted from the worksheet.
                DataSet ds = new DataSet();

                // Fill the DataSet from the data extracted from the worksheet.
                oleda.Fill(ds, "CensoInventarioTerreno");

                // Bind the data to the GridView
                GridView1.DataSource = ds.Tables[0].DefaultView;
                GridView1.DataBind();
                procesarInventario(ds);
            }
            catch (Exception ex)
            {
                Label1.Text = "ERROR: " + ex.Message.ToString() + "<br>" +
                              "Path: " + realPhysicalPath + "<br>" +
                              "Connection: " + ExcelConnection;
            }
            finally
            {
                // Close connection
                oledbConn.Close();
            }
        }

        private void procesarInventario(DataSet ds)
        {

            
            DataTable dt = ds.Tables[0];

            foreach (DataRow dr in dt.Rows)
            {
                Elemento nuevoElemento = new Elemento();
                nuevoElemento.IdEspecie = int.Parse(dr["Especie"].ToString());
                nuevoElemento.Dap = double.Parse(dr["DAP"].ToString());
                nuevoElemento.Hc = double.Parse(dr["HC"].ToString());
                nuevoElemento.LambertN = double.Parse(dr["LambertN"].ToString());
                nuevoElemento.LambertE = double.Parse(dr["LambertE"].ToString());
                nuevoElemento.TipoTerreno = dr["TipoTerreno"].ToString();

                //Calcular Volumen y Area Basal
                Especies especie = new Especies();
                especie = especie.buscarEspecieId(nuevoElemento.IdEspecie);

                nuevoElemento.Volumen = Calculos.getVolumenTotal(nuevoElemento.Dap, nuevoElemento.Hc, especie.NumFormula);
                nuevoElemento.AreaBasal = Calculos.getAreaBasal(nuevoElemento.Dap, nuevoElemento.Hc);

                nuevoElemento.LambertE = Calculos.getMinDec(nuevoElemento.LambertE);
                nuevoElemento.LambertN = Calculos.getMinDec(nuevoElemento.LambertN);

                nuevoElemento.Crtm05N = Calculos.getCrmt05N(nuevoElemento.LambertN, nuevoElemento.LambertE);
                nuevoElemento.Crtm05E = Calculos.getCrmt05E(nuevoElemento.LambertN, nuevoElemento.LambertE);

                nuevoElemento.IdCenso = estudio.CodEstudio;

                bool result = nuevoElemento.ingresaElemento();
            }
        }

        private void readNewFileCSV()
        {

            try
            {
                List<string[]> parsedData = new List<string[]>();

                using (StreamReader readFile = new StreamReader(realPhysicalPath))
                {
                    string line;
                    string[] row;
                    bool filaVacia = false;

                    while ((line = readFile.ReadLine()) != null && filaVacia == false)
                    {
                        row = line.Split(',');
                        if (row[0] == null || row[0] == "")
                        {
                            filaVacia = true;
                        }
                        else
                        {
                            parsedData.Add(row);
                        }
                    }
                }

                DataTable dt = new DataTable();

                string[] columnas = { "Especie", "DAP", "HC", "TipoTerreno", "LambertN", "LambertE" };

                foreach (string column in columnas)
                {
                    dt.Columns.Add(column);
                }

                foreach (string[] row in parsedData)
                {
                    dt.Rows.Add(row);
                }

                // Bind the data to the GridView
                GridView1.DataSource = dt;
                GridView1.DataBind();
                procesarInventarioCSV(dt);
            }
            catch (Exception ex)
            {
                Label1.Text = "ERROR: " + ex.Message.ToString() + "<br>" +
                              "Path: " + realPhysicalPath + "<br>"/* +
                              "Connection: " + ExcelConnection*/;
            }
        }

        private void procesarInventarioCSV(DataTable dt)
        {
            
            foreach (DataRow dr in dt.Rows)
            {
                Elemento nuevoElemento = new Elemento();
                nuevoElemento.IdEspecie = int.Parse(dr["Especie"].ToString());
                nuevoElemento.Dap = double.Parse(dr["DAP"].ToString());
                nuevoElemento.Hc = double.Parse(dr["HC"].ToString());
                nuevoElemento.LambertN = double.Parse(dr["LambertN"].ToString());
                nuevoElemento.LambertE = double.Parse(dr["LambertE"].ToString());
                nuevoElemento.TipoTerreno = dr["TipoTerreno"].ToString();

                //Calcular Volumen y Area Basal
                Especies especie = new Especies();
                especie = especie.buscarEspecieId(nuevoElemento.IdEspecie);

                nuevoElemento.Volumen = Calculos.getVolumenTotal(nuevoElemento.Dap, nuevoElemento.Hc, especie.NumFormula);
                nuevoElemento.AreaBasal = Calculos.getAreaBasal(nuevoElemento.Dap, nuevoElemento.Hc);

                nuevoElemento.LambertE = Calculos.getMinDec(nuevoElemento.LambertE);
                nuevoElemento.LambertN = Calculos.getMinDec(nuevoElemento.LambertN);

                nuevoElemento.Crtm05N = Calculos.getCrmt05N(nuevoElemento.LambertN, nuevoElemento.LambertE);
                nuevoElemento.Crtm05E = Calculos.getCrmt05E(nuevoElemento.LambertN, nuevoElemento.LambertE);

                nuevoElemento.IdCenso = estudio.CodEstudio;

                bool result = nuevoElemento.ingresaElemento();
            }
        }

        protected void eliminarInventario()
        {
            foreach (Elemento tmp_elemento in listaElementos)
            {
                tmp_elemento.borrarElemento();
            }
        }


        private void getEstudioDetalle()
        {

            //Genera el objeto estudio
            string codEstudio = Request["codEstudio"];
            estudio.getEstudioxId(int.Parse(codEstudio));

            //Obtener la lista de especies
            List<Especies> listaEspecies = new List<Especies>();
            Especies tmp_especie = new Especies();
            listaEspecies = tmp_especie.getListaEspecies();

            //Obtener la lista de especies en inventario
            Elemento tmp_elemento = new Elemento();
            listaElementos = tmp_elemento.getElementosCenso(estudio.CodEstudio);

            //Mostrar datos básicos del estudio
            this.lb_Cliente.Text = estudio.Cliente.Nombre + " " + estudio.Cliente.Ap1 + " " + estudio.Cliente.Ap2;
            this.lb_Parcela.Text = "" + estudio.Terreno.Nombre;
            this.lb_Finca.Text = "" + estudio.Terreno.Terreno_padre.Nombre;

        }

    }
}